{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "NLP/AM.ipynb",
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
        {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<table align=\"left\">\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/gimseng/99-ML-Learning-Projects/blob/master/004/solution/text_generation_model.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n",
    "  </td>\n",
    "</table>"
   ]
  },
    {
      "cell_type": "code",
      "metadata": {
        "id": "vCeuItMueCwD",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
        "from tensorflow.keras.layers import Embedding, LSTM, Dense, Dropout, Bidirectional\n",
        "from tensorflow.keras.preprocessing.text import Tokenizer\n",
        "from tensorflow.keras.models import Sequential\n",
        "from tensorflow.keras.optimizers import Adam\n",
        "from tensorflow.keras import regularizers\n",
        "import tensorflow.keras.utils as ku \n",
        "import numpy as np \n",
        "import urllib.request"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "qmt0becXfOaN",
        "colab_type": "code",
        "colab": {}
      },
      "source": [        
        "data_url='https://raw.githubusercontent.com/gimseng/99-ML-Learning-Projects/master/004/data/AM.txt'\n",
        "\n",
        "data=''\n",
        "with urllib.request.urlopen(data_url) as f:\n",
        "\tdata=data.join(f.read().decode())\n",
        "\n", 
        "corpus = data.lower().split(\"\\n\")\n",
        "\n",
        "tokenizer = Tokenizer()\n",
        "tokenizer.fit_on_texts(corpus)\n",
        "total_words = len(tokenizer.word_index) + 1\n",
        "\n",
        "# create input sequences using list of tokens\n",
        "input_sequences = []\n",
        "for line in corpus:\n",
        "\ttoken_list = tokenizer.texts_to_sequences([line])[0]\n",
        "\tfor i in range(1, len(token_list)):\n",
        "\t\tn_gram_sequence = token_list[:i+1]\n",
        "\t\tinput_sequences.append(n_gram_sequence)\n",
        "\n",
        "\n",
        "# pad sequences \n",
        "max_sequence_len = max([len(x) for x in input_sequences])\n",
        "input_sequences = np.array(pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre'))\n",
        "\n",
        "# create predictors and label\n",
        "predictors, label = input_sequences[:,:-1],input_sequences[:,-1]\n",
        "\n",
        "label = ku.to_categorical(label, num_classes=total_words)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "J_bT2rDsmoPj",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 374
        },
        "outputId": "2897de10-dbf6-4317-a573-4182d13d3c34"
      },
      "source": [
        "model = Sequential()\n",
        "model.add(Embedding(total_words, 100, input_length=max_sequence_len-1))\n",
        "model.add(Bidirectional(LSTM(150, return_sequences = True)))\n",
        "model.add(Dropout(0.2))\n",
        "model.add(LSTM(100))\n",
        "model.add(Dense(total_words/2, activation='relu', kernel_regularizer=regularizers.l2(0.01)))\n",
        "model.add(Dense(total_words, activation='softmax'))\n",
        "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
        "print(model.summary())\n"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"sequential\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "embedding (Embedding)        (None, 16, 100)           136400    \n",
            "_________________________________________________________________\n",
            "bidirectional (Bidirectional (None, 16, 300)           301200    \n",
            "_________________________________________________________________\n",
            "dropout (Dropout)            (None, 16, 300)           0         \n",
            "_________________________________________________________________\n",
            "lstm_1 (LSTM)                (None, 100)               160400    \n",
            "_________________________________________________________________\n",
            "dense (Dense)                (None, 682)               68882     \n",
            "_________________________________________________________________\n",
            "dense_1 (Dense)              (None, 1364)              931612    \n",
            "=================================================================\n",
            "Total params: 1,598,494\n",
            "Trainable params: 1,598,494\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n",
            "None\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "CzQjTiHEmsIH",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "outputId": "38ee0ba9-ea57-45c3-f9bc-ad55f623eefc"
      },
      "source": [
        " history = model.fit(predictors, label, epochs=100, verbose=1)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/100\n",
            "192/192 [==============================] - 17s 86ms/step - loss: 5.1828 - accuracy: 0.0774\n",
            "Epoch 2/100\n",
            "192/192 [==============================] - 16s 86ms/step - loss: 5.0570 - accuracy: 0.0822\n",
            "Epoch 3/100\n",
            "192/192 [==============================] - 17s 86ms/step - loss: 4.9510 - accuracy: 0.0913\n",
            "Epoch 4/100\n",
            "192/192 [==============================] - 17s 87ms/step - loss: 4.8663 - accuracy: 0.0937\n",
            "Epoch 5/100\n",
            "192/192 [==============================] - 16s 86ms/step - loss: 4.7793 - accuracy: 0.0980\n",
            "Epoch 6/100\n",
            "192/192 [==============================] - 16s 86ms/step - loss: 4.6987 - accuracy: 0.1009\n",
            "Epoch 7/100\n",
            "192/192 [==============================] - 17s 87ms/step - loss: 4.6328 - accuracy: 0.1068\n",
            "Epoch 8/100\n",
            "192/192 [==============================] - 16s 86ms/step - loss: 4.5563 - accuracy: 0.1100\n",
            "Epoch 9/100\n",
            "192/192 [==============================] - 17s 86ms/step - loss: 4.4846 - accuracy: 0.1175\n",
            "Epoch 10/100\n",
            "192/192 [==============================] - 16s 86ms/step - loss: 4.4149 - accuracy: 0.1237\n",
            "Epoch 11/100\n",
            "192/192 [==============================] - 17s 86ms/step - loss: 4.3428 - accuracy: 0.1276\n",
            "Epoch 12/100\n",
            "192/192 [==============================] - 17s 86ms/step - loss: 4.2673 - accuracy: 0.1373\n",
            "Epoch 13/100\n",
            "192/192 [==============================] - 16s 86ms/step - loss: 4.2045 - accuracy: 0.1396\n",
            "Epoch 14/100\n",
            "192/192 [==============================] - 17s 86ms/step - loss: 4.1234 - accuracy: 0.1555\n",
            "Epoch 15/100\n",
            "192/192 [==============================] - 17s 86ms/step - loss: 4.0475 - accuracy: 0.1599\n",
            "Epoch 16/100\n",
            "192/192 [==============================] - 16s 86ms/step - loss: 3.9793 - accuracy: 0.1678\n",
            "Epoch 17/100\n",
            "192/192 [==============================] - 17s 86ms/step - loss: 3.9229 - accuracy: 0.1775\n",
            "Epoch 18/100\n",
            "192/192 [==============================] - 16s 86ms/step - loss: 3.8363 - accuracy: 0.1919\n",
            "Epoch 19/100\n",
            "192/192 [==============================] - 17s 86ms/step - loss: 3.7698 - accuracy: 0.2075\n",
            "Epoch 20/100\n",
            "192/192 [==============================] - 17s 86ms/step - loss: 3.6995 - accuracy: 0.2147\n",
            "Epoch 21/100\n",
            "192/192 [==============================] - 16s 86ms/step - loss: 3.6667 - accuracy: 0.2222\n",
            "Epoch 22/100\n",
            "192/192 [==============================] - 16s 86ms/step - loss: 3.5764 - accuracy: 0.2400\n",
            "Epoch 23/100\n",
            "192/192 [==============================] - 17s 87ms/step - loss: 3.4994 - accuracy: 0.2543\n",
            "Epoch 24/100\n",
            "192/192 [==============================] - 17s 89ms/step - loss: 3.4221 - accuracy: 0.2682\n",
            "Epoch 25/100\n",
            "192/192 [==============================] - 17s 89ms/step - loss: 3.3579 - accuracy: 0.2828\n",
            "Epoch 26/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 3.2877 - accuracy: 0.2926\n",
            "Epoch 27/100\n",
            "192/192 [==============================] - 17s 89ms/step - loss: 3.2190 - accuracy: 0.3122\n",
            "Epoch 28/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 3.1549 - accuracy: 0.3316\n",
            "Epoch 29/100\n",
            "192/192 [==============================] - 17s 91ms/step - loss: 3.0945 - accuracy: 0.3459\n",
            "Epoch 30/100\n",
            "192/192 [==============================] - 18s 91ms/step - loss: 3.0194 - accuracy: 0.3604\n",
            "Epoch 31/100\n",
            "192/192 [==============================] - 18s 91ms/step - loss: 2.9583 - accuracy: 0.3714\n",
            "Epoch 32/100\n",
            "192/192 [==============================] - 18s 92ms/step - loss: 2.9045 - accuracy: 0.3854\n",
            "Epoch 33/100\n",
            "192/192 [==============================] - 17s 91ms/step - loss: 2.8367 - accuracy: 0.3988\n",
            "Epoch 34/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 2.7816 - accuracy: 0.4108\n",
            "Epoch 35/100\n",
            "192/192 [==============================] - 17s 91ms/step - loss: 2.7388 - accuracy: 0.4206\n",
            "Epoch 36/100\n",
            "192/192 [==============================] - 17s 91ms/step - loss: 2.6883 - accuracy: 0.4381\n",
            "Epoch 37/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 2.6265 - accuracy: 0.4441\n",
            "Epoch 38/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 2.5706 - accuracy: 0.4636\n",
            "Epoch 39/100\n",
            "192/192 [==============================] - 17s 89ms/step - loss: 2.5250 - accuracy: 0.4790\n",
            "Epoch 40/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 2.4793 - accuracy: 0.4865\n",
            "Epoch 41/100\n",
            "192/192 [==============================] - 17s 89ms/step - loss: 2.4252 - accuracy: 0.5018\n",
            "Epoch 42/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 2.3796 - accuracy: 0.5101\n",
            "Epoch 43/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 2.3311 - accuracy: 0.5204\n",
            "Epoch 44/100\n",
            "192/192 [==============================] - 17s 89ms/step - loss: 2.2916 - accuracy: 0.5316\n",
            "Epoch 45/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 2.2396 - accuracy: 0.5419\n",
            "Epoch 46/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 2.1984 - accuracy: 0.5553\n",
            "Epoch 47/100\n",
            "192/192 [==============================] - 17s 89ms/step - loss: 2.1550 - accuracy: 0.5701\n",
            "Epoch 48/100\n",
            "192/192 [==============================] - 17s 89ms/step - loss: 2.1075 - accuracy: 0.5815\n",
            "Epoch 49/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 2.0673 - accuracy: 0.5890\n",
            "Epoch 50/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 2.0442 - accuracy: 0.5915\n",
            "Epoch 51/100\n",
            "192/192 [==============================] - 17s 89ms/step - loss: 2.0094 - accuracy: 0.5998\n",
            "Epoch 52/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.9653 - accuracy: 0.6115\n",
            "Epoch 53/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.9246 - accuracy: 0.6281\n",
            "Epoch 54/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.8867 - accuracy: 0.6325\n",
            "Epoch 55/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.8422 - accuracy: 0.6477\n",
            "Epoch 56/100\n",
            "192/192 [==============================] - 17s 91ms/step - loss: 1.8286 - accuracy: 0.6485\n",
            "Epoch 57/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.7826 - accuracy: 0.6567\n",
            "Epoch 58/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.7652 - accuracy: 0.6648\n",
            "Epoch 59/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.7341 - accuracy: 0.6712\n",
            "Epoch 60/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.7101 - accuracy: 0.6725\n",
            "Epoch 61/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.6627 - accuracy: 0.6886\n",
            "Epoch 62/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.6396 - accuracy: 0.6971\n",
            "Epoch 63/100\n",
            "192/192 [==============================] - 17s 89ms/step - loss: 1.6186 - accuracy: 0.6992\n",
            "Epoch 64/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.5928 - accuracy: 0.7085\n",
            "Epoch 65/100\n",
            "192/192 [==============================] - 17s 89ms/step - loss: 1.5579 - accuracy: 0.7121\n",
            "Epoch 66/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.5368 - accuracy: 0.7191\n",
            "Epoch 67/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.5045 - accuracy: 0.7263\n",
            "Epoch 68/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.4956 - accuracy: 0.7300\n",
            "Epoch 69/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.4762 - accuracy: 0.7357\n",
            "Epoch 70/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.4507 - accuracy: 0.7375\n",
            "Epoch 71/100\n",
            "192/192 [==============================] - 17s 89ms/step - loss: 1.4269 - accuracy: 0.7427\n",
            "Epoch 72/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.3969 - accuracy: 0.7529\n",
            "Epoch 73/100\n",
            "192/192 [==============================] - 17s 91ms/step - loss: 1.3759 - accuracy: 0.7556\n",
            "Epoch 74/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.3573 - accuracy: 0.7592\n",
            "Epoch 75/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.3484 - accuracy: 0.7607\n",
            "Epoch 76/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.3463 - accuracy: 0.7546\n",
            "Epoch 77/100\n",
            "192/192 [==============================] - 17s 91ms/step - loss: 1.3184 - accuracy: 0.7709\n",
            "Epoch 78/100\n",
            "192/192 [==============================] - 17s 91ms/step - loss: 1.2901 - accuracy: 0.7732\n",
            "Epoch 79/100\n",
            "192/192 [==============================] - 18s 91ms/step - loss: 1.2754 - accuracy: 0.7757\n",
            "Epoch 80/100\n",
            "192/192 [==============================] - 18s 91ms/step - loss: 1.2615 - accuracy: 0.7776\n",
            "Epoch 81/100\n",
            "192/192 [==============================] - 17s 91ms/step - loss: 1.2481 - accuracy: 0.7804\n",
            "Epoch 82/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.2264 - accuracy: 0.7830\n",
            "Epoch 83/100\n",
            "192/192 [==============================] - 17s 91ms/step - loss: 1.2147 - accuracy: 0.7874\n",
            "Epoch 84/100\n",
            "192/192 [==============================] - 17s 91ms/step - loss: 1.1994 - accuracy: 0.7894\n",
            "Epoch 85/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.1802 - accuracy: 0.7952\n",
            "Epoch 86/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.1677 - accuracy: 0.7988\n",
            "Epoch 87/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.1553 - accuracy: 0.7978\n",
            "Epoch 88/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.1423 - accuracy: 0.7988\n",
            "Epoch 89/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.1337 - accuracy: 0.7980\n",
            "Epoch 90/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.1251 - accuracy: 0.8044\n",
            "Epoch 91/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.1028 - accuracy: 0.8097\n",
            "Epoch 92/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.0899 - accuracy: 0.8070\n",
            "Epoch 93/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.0757 - accuracy: 0.8140\n",
            "Epoch 94/100\n",
            "192/192 [==============================] - 17s 91ms/step - loss: 1.0714 - accuracy: 0.8084\n",
            "Epoch 95/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.0588 - accuracy: 0.8177\n",
            "Epoch 96/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.0554 - accuracy: 0.8164\n",
            "Epoch 97/100\n",
            "192/192 [==============================] - 17s 91ms/step - loss: 1.0388 - accuracy: 0.8186\n",
            "Epoch 98/100\n",
            "192/192 [==============================] - 17s 90ms/step - loss: 1.0370 - accuracy: 0.8150\n",
            "Epoch 99/100\n",
            "192/192 [==============================] - 17s 89ms/step - loss: 1.0231 - accuracy: 0.8210\n",
            "Epoch 100/100\n",
            "192/192 [==============================] - 17s 86ms/step - loss: 1.0051 - accuracy: 0.8230\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "MTcSinokmzih",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 545
        },
        "outputId": "37eb2319-b4a8-4284-f80e-26ebe13cfda2"
      },
      "source": [
        "import matplotlib.pyplot as plt\n",
        "acc = history.history['accuracy']\n",
        "loss = history.history['loss']\n",
        "\n",
        "epochs = range(len(acc))\n",
        "\n",
        "plt.plot(epochs, acc, 'b', label='Training accuracy')\n",
        "plt.title('Training accuracy')\n",
        "\n",
        "plt.figure()\n",
        "\n",
        "plt.plot(epochs, loss, 'b', label='Training Loss')\n",
        "plt.title('Training loss')\n",
        "plt.legend()\n",
        "\n",
        "plt.show()"
      ],
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAEICAYAAABPgw/pAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deXgUVdbH8e8RRhFcEAEZWYRRVHDHDLiNOwou4D6AqLhFXwU3nBEHx31m3B0VRBDFjUVxQVQUF0CGUYGgjBoQRVwIgoRFQFAkcN4/bqNtTEgHulPp6t/nefohVXXTdZoKh5tTt+41d0dERLLfZlEHICIi6aGELiISE0roIiIxoYQuIhITSugiIjGhhC4iEhNK6FKtmNmrZnZOutuK5ALTOHTZVGb2fdJmbWA1sDaxfZG7D636qERyjxK6pJWZfQlc4O5vlnGspruXVH1U2UV/T7KxVHKRjDGzw82syMyuMbMFwBAz287MXjazYjNbmvi6SdL3TDCzCxJf9zCzSWZ2V6LtF2bWcSPbtjCziWa2wszeNLP+ZvZUOXFXFGM9MxtiZt8kjo9KOtbZzKab2XIz+9zMOiT2f2lmRye1u3H9+c2suZm5mZ1vZl8D4xL7R5rZAjNbloh9j6Tv39LM7jazrxLHJyX2vWJmvUp9ng/N7OTKXj/JPkrokmmNgHrATkA+4WduSGK7GfAD0G8D398OmAXUB+4AHjEz24i2w4ApwPbAjcBZGzhnRTE+SSgt7QE0BO4FMLO2wBPAX4C6wKHAlxs4T2mHAa2AYxPbrwItE+d4H0guXd0F7A8cRPj7/SuwDngc6L6+kZntAzQGXqlEHJKt3F0vvdL2IiSwoxNfHw78BNTaQPt9gaVJ2xMIJRuAHsDspGO1AQcaVaYtISmXALWTjj8FPJXiZ/o5RuD3hMS5XRntBgL3VvT3kti+cf35geaJWP+wgRjqJtpsS/gP5wdgnzLa1QKWAi0T23cBD0b9c6FX1bzUQ5dMK3b3H9dvmFltMxuYKBUsByYCdc2sRjnfv2D9F+6+KvHlVpVsuyOwJGkfwNzyAq4gxqaJ91paxrc2BT4v731T8HNMZlbDzG5LlG2W80tPv37iVauscyX+rp8GupvZZkBXwm8UkgOU0CXTSt917w3sBrRz920IZQmA8soo6TAfqGdmtZP2Nd1A+w3FODfxXnXL+L65wM7lvOdKwm8N6zUqo03y31U3oDNwNKFX3jwphkXAjxs41+PAmcBRwCp3f7ecdhIzSuhS1bYmlAu+M7N6wA2ZPqG7fwUUADea2eZmdiBw4sbE6O7zCbXtBxM3T39nZusT/iPAuWZ2lJltZmaNzWz3xLHpQJdE+zzgtArC3pow/HMx4T+CfybFsA54FLjHzHZM9OYPNLMtEsffJZSF7ka985yihC5V7d/AloRe5nvAa1V03jOBAwkJ8lZCWWJ1OW0rivEsYA3wCbAQuALA3acA5xJuki4D3ibcWAX4O6FHvRS4iXCTdkOeAL4C5gEzEnEkuxr4CJgKLAFu59f/np8A9iLcK5AcoXHokpPM7GngE3fP+G8IUTCzs4F8dz8k6lik6qiHLjnBzP5oZjsnSiEdCPXpURV9XzZK3Cu4BBgUdSxStZTQJVc0Igxz/B64H/g/d/8g0ogywMyOBYqBb6m4rCMxo5KLiEhMqIcuIhITNaM6cf369b158+ZRnV5EJCtNmzZtkbs3KOtYZAm9efPmFBQURHV6EZGsZGZflXdMJRcRkZhQQhcRiQkldBGRmFBCFxGJCSV0EZGYUEIXEYkJJXQRkZiIbBy6iEiuKCmB2bOhsDC8jj8e9t8//edRQhcRqQR3WLwYttsOaiQWTvzpJ5gxA+bNg4MOCscAli6FO++EBx6A778P+8ygQQMldBGRKrNuHaxZA1ts8cu+Zcuge3d4+eWQzHfcEbbaCj77LPTCAWrWhEMPhb32gsceg+XL4Ywz4LjjYI89oFUrqF27zFNuMiV0EZFS3ngDevaEoiLIz4fevWHFCjjpJJgzB/r0gc02C8eXLYPOnWGffWCHHcL3jhoF48ZBp05wyy2w995VE3dK0+cmFgS4D6gBDHb320odb0ZYmLZuok0fdx+zoffMy8tzzeUiIlH58Ud48km4995QGjnkEPjTn2DSJBg5EnbZBdq2haefDsl7882hTh149tnQriIrV4b26WZm09w9r6xjFY5yMbMaQH+gI9Aa6GpmrUs1uw54xt33A7oAD25ayCIimfHDD3DXXdCiReh9164NRx0FU6bA5ZfDSy+FXvVHH8HQoeFmZn4+HHYYTJuWWjKHzCTziqRScmkLzHb3OQBmNoKwfNeMpDYObJP4elvgm3QGKSKyIUuXhlp3cm26pASWLAn7t9km3Mx86im47jqYOxfatw/bRx4ZblQCfP011KoFDRv+8j7Nm0O/flX6cTZaKgm9MTA3absIaFeqzY3A62bWC6gDHF3WG5lZPpAP0KxZs8rGKiLys48+ghdegBdfhPffD/vq1IHttw/ljiVLQhKHcAOzdu1QB99/f3j8cTjiiN++Z7anpXTdFO0KPObud5vZgcCTZranu69LbuTug0gsXJuXl6e170Sk0t59F264Idx8NIMDDwwlkpo1YeHCMKSwTp3Qy65fPwwpXLIEvvsu1MnPOCPUxOMolYQ+D2iatN0ksS/Z+UAHAHd/18xqAfWBhekIUkRy19y58PHH4YGcN96A118P47jvuAPOPjuMLJEglYQ+FWhpZi0IibwL0K1Um6+Bo4DHzKwVUIuw8riISKUtWQLDhsGQIb+UUwCaNIHbboNLLw3jv+XXKkzo7l5iZj2BsYQhiY+6e6GZ3QwUuPtooDfwsJldSbhB2sNTGQ8pIkIok7zzzi+v994LpZJ99w0jUtq2DQ/l1KsXdaTVW0rj0DNB49BFctPy5b/MaVJQAP/5T3hsHkIdvE2bMDSwe/eQ0OXXNjQOXU+KikjGrFgB06eHxD1lSnjNmfPL8a23hoMPhjPPDDcs//hH2HLL6OLNdkroIpJ2d9wBjz4Kn376y9DBpk2hXTu44ALYc89QQmnePL4jTqKghC4iaTVqFFxzTSibdOsWxn23aQO//33UkcWfErqIpM0334QeeJs28OabYf4TqTr6ZUdEUrJmTUjSV10VpoJt1SoMHTz2WJg6NUw326MHrFoVhhwqmVc99dBFpEzr1sHMmWEUyoQJ8NprYarYWrVCMm/dGg4/PMw+2LYt7LcffPABDBwIu+0WdfS5SQldRH5j/Pgw8mT+/LDdqBGcckqY97t9+19PgnXHHfDvf4fx4qeeChdeGE3MonHoIlLKk0/C+edDy5Zw9dXh5ubOO/8yI2F5Vq8O48jXL8smmaFx6CJSobVr4Z//hOuvDzMRPv881K2b+vcnL9Um0VBCF8lxK1eGtS/vvRc+/xzOOgsGD9ZNzWykhC6SY779NvS+Z86EWbPC05vffRdubP7rX3DaaRWXV6R6UkIXyRHz54cbmA89FNbT3GqrMBqlc+cwdvzgg5XIs50SukiMff89vPoqPPdceIKzpCSUVP7ylzD0UAk8XpTQRWJo2TL4+9/h4YdDb7xhwzBypXdv+MMfoo5OMkUJXSRG3GHkSLjiCliwAM47L/TIDzlEwwlzgRK6SEx89hn06gVjx4a5VEaPhrwyRytLXGkuF5Est2pVKK/suWdYQPm++8LIFSXz3KMeukgWWrYs9MBffDHMsbJyZVjh5847w2P6kptSSuhm1gG4j7Cm6GB3v63U8XuBIxKbtYGG7l6JZ8xEJFXvvRfmTPnmmzDHePfucPbZcNBBUUcmUaswoZtZDaA/0B4oAqaa2Wh3n7G+jbtfmdS+F7BfBmIVyXmDB4cV75s0gYkTw9hxrfgj66XSQ28LzHb3OQBmNgLoDMwop31X4Ib0hCeS25YuDfXwDz8M09i+9BIccwwMHw716kUdnVQ3qST0xsDcpO0ioF1ZDc1sJ6AFMK6c4/lAPkCzZs0qFahIrhk+HC66KCy0DKFXft11cOONGoIoZUv3L2tdgGfdfW1ZB919kLvnuXtegwYN0nxqkXhYuTKMH+/WDfbaC956CxYtgrlz4ZZblMylfKn00OcBTZO2myT2laULcOmmBiWSq1asCDc3Cwuhb9/QG6+psWiSolR+VKYCLc2sBSGRdwG6lW5kZrsD2wHvpjVCkRzSqxfMmAEvvxzW7RSpjApLLu5eAvQExgIzgWfcvdDMbjazTklNuwAjPKolkESy3PDh8PjjoU6uZC4bQ0vQiVQDX3wB++4bnvZ8+22VWaR8WoJOpJpxDw8IffppuNk5cmTYP3SokrlsPP3oiFSxd98N85H/97+/7GvUKJRbmjePLCyJASV0kSryzTdw+eXw7LMhgQ8YAEcfHcaX16oVdXQSB0roIlXg+efhwgvhhx/CUMTevcMScCLppIQukkErVoRe+ZAhsP/+oUa+225RRyVxpWl9RDLknXfCyJXHHoO//S3UzpXMJZPUQxdJkxUrYPFiWLIkLMj8j39As2ZhVsRDDok6OskFSugiaXD33WHkSvJjHeecA/ffD9tsE11ckluU0EU20fjx8Ne/QseOcNppYVrbnXYK5RaRqqSELrIJvvkGunSBXXeFp5/WyBWJlhK6yEYqKQnJ/PvvYdw4JXOJnka5iFTS0qXw4IPQtm1YRWjQINhjj6ijElFCF6mU/v3DwsyXXgrr1sEjj8CZZ0YdlUigkotIiqZNgyuugCOOgNtvh/20FLpUM0roIin44Qfo3h122AFGjNACzVI9KaGLpOCaa+CTT+D115XMpfpSDV2kAmPHwgMPwGWXQfv2UUcjUr6UErqZdTCzWWY228z6lNPmDDObYWaFZjYsvWGKROO99+D008MolttuizoakQ2rsORiZjWA/kB7oAiYamaj3X1GUpuWwLXAwe6+1MwaZipgkaoyZQoceyw0bBh66VtuGXVEIhuWSg+9LTDb3ee4+0/ACKBzqTYXAv3dfSmAuy9Mb5giVWvqVDjmGKhfPzza37hx1BGJVCyVhN4YmJu0XZTYl2xXYFcz+6+ZvWdmHcp6IzPLN7MCMysoLi7euIhFMsgd+vWDP/0JttsuJPOmTaOOSiQ16bopWhNoCRwOdAUeNrO6pRu5+yB3z3P3vAYNGqTp1CLpsWABnHgi9OoFRx0V6ufNmkUdlUjqUhm2OA9I7qM0SexLVgRMdvc1wBdm9ikhwU9NS5QiGeAeJtR69VWYPBlmzYIttghT3vbsCWZRRyhSOakk9KlASzNrQUjkXYBupdqMIvTMh5hZfUIJZk46AxVJp88/h/z8MKnWDjtAu3bhwaHTToPdd486OpGNU2FCd/cSM+sJjAVqAI+6e6GZ3QwUuPvoxLFjzGwGsBb4i7svzmTgIhvDPYwp79MHfvc7GDgQLrgANtMTGRID5slLrFShvLw8LygoiOTckpvcw9qet90Gxx8PDz0ETZpEHZVI5ZjZNHfPK+uYHv2XnOAeVhW6665QahkwQL1yiR/9SEvsucPVV4dkfsklSuYSX/qxltgbOBDuuSeMXOnXT8lc4ks/2hJrkyeHSbU6doT77tNQRIk3JXSJrYULwzDExo3hqafUM5f4001RiaWSEujaFRYtgnfe0RzmkhuU0CV23MPNz3HjYMgQLRUnuUO/hErs3HEHPPwwXHst9OgRdTQiVUcJXWLl6afDU6BdusCtt0YdjUjVUkKX2HjxRTjnHDjkkFBq0U1QyTX6kZdYGDAATjkF9tkHRo2CWrWijkik6imhS1ZzD7XySy6B444LN0K33z7qqESioYQuWWvdOrj44jDZ1kUXwQsvQJ06UUclEh0ldMlKa9fCeefBoEGhhz5gANTUIFzJcfonIFmnpATOPhuGD4ebboK//12P9IuAErpkme+/hz//GcaMCaWWa66JOiKR6kMJXbLGt9/CCSfA+++HGRTz86OOSKR6UUKXrFBYCJ06wYIFYbz5CSdEHZFI9ZPSTVEz62Bms8xstpn1KeN4DzMrNrPpidcF6Q9VcpF7uOGZlxfKLePHK5mLlKfCHrqZ1QD6A+2BImCqmY129xmlmj7t7j0zEKPkqCVL4NxzYfRo6NAhPP3ZqFHUUYlUX6n00NsCs919jrv/BIwAOmc2LMl1a9eGucxfew3uvRdeeUXJXKQiqST0xsDcpO2ixL7STjWzD83sWTNrWtYbmVm+mRWYWUFxcfFGhCu54qabQnll4EC44grNyyKSinT9M3kJaO7uewNvAI+X1cjdB7l7nrvnNWjQIE2nlrgZOzbMlHjuuZr+VqQyUkno84DkHneTxL6fuftid1+d2BwM7J+e8CTXzJ0L3bvDHnuEBZ1FJHWpJPSpQEsza2FmmwNdgNHJDczs90mbnYCZ6QtRcoF7mMt8//3hhx9g5EioXTvqqESyS4UJ3d1LgJ7AWEKifsbdC83sZjPrlGh2mZkVmtn/gMuAHpkKWOJn/nw46aSwKMVOO4U1QHffPeqoRLKPuXskJ87Ly/OCgoJIzi3Vx6pVcMABMHs23HILXH65JtkS2RAzm+bueWUd0z8diVSvXvDxx2F44jHHRB2NSHbTYDCJzGOPwaOPwnXXKZmLpIMSukTi44/DKkNHHAE33BB1NCLxoIQuVW7tWjjrLNhmGxg2DGrUiDoikXhQDV2q3MCBMH06PPOMHucXSSf10KVKFRdD375w5JFhrhYRSR8ldKlSffuGaXAfeEDLxomkmxK6VJmCAhg8OAxVbN066mhE4kcJXTKupCQMTzzpJGjYUKNaRDJFCV0yasyYMNHW+efDjjuG5eO23TbqqETiSQldMqawEE4+OQxLHDUKJk+Gdu2ijkokvjRsUTKipCTMZ77NNvD226Dp70UyTwldMuLuu2Hq1DDWXMlcpGqo5CJpN2MGXH99GGd++ulRRyOSO5TQJa0WLYIzzwyllv79o45GJLeo5CJpM2MGnHBCWLDiuefCEEURqTrqoUtavP46HHhgWLBiwgQ47rioIxLJPSkldDPrYGazzGy2mfXZQLtTzczNrMzVNCSeXnoJjj8emjeHKVM0NFEkKhUmdDOrAfQHOgKtga5m9psHt81sa+ByYHK6g5Tq6403ws3P/faDiROhWbOoIxLJXan00NsCs919jrv/BIwAOpfR7hbgduDHNMYn1djEidC5M7RqFZaQ0xOgItFKJaE3BuYmbRcl9v3MzNoATd39lQ29kZnlm1mBmRUUFxdXOlipPqZPDzdAmzcP9fN69aKOSEQ2+aaomW0G3AP0rqituw9y9zx3z2ugp02yVlFRqJlvu20ouWg0i0j1kMqwxXlA06TtJol9620N7AlMsDDBdSNgtJl1cveCdAUq1cPy5SGZr1gB//0vNG5c8feISNVIJaFPBVqaWQtCIu8CdFt/0N2XAfXXb5vZBOBqJfP4KSmBM84I483HjIG99oo6IhFJVmHJxd1LgJ7AWGAm8Iy7F5rZzWbWKdMBSvVx5ZUwdiw89BC0bx91NCJSWkpPirr7GGBMqX3Xl9P28E0PS6qbgQOhXz/o3TvMbS4i1Y+eFJUKTZgAPXtCx45w++1RRyMi5VFClw0qLIRTT4WWLWH48LBYhYhUT0roUq6pU+HQQ2GLLWD0aD04JFLdKaFLmSZOhKOOCtPg/uc/sMsuUUckIhVRQpffmDQJjj02jDGfNAl23jnqiEQkFZoPXX6lqCjUzJs2Db10PdArkj2U0OVnq1eHZL5qFYwfr2Qukm2U0AUAd7j00jCf+fPPQ+vfTJAsItWdaugChKc/H3kErrsOTj456mhEZGMooQsTJ8Jll4VJt268MepoRGRjKaHnuK+/DisO7bwzDB2qB4dEspkSeg5btSqUV1avhhdf1INDItlON0VzWN++8MEHYZHn3XaLOhoR2VTqoeeojz6CBx6A/PxQOxeR7KeEnoPWD1Hcdlv4xz+ijkZE0kUllxw0fHiYn2XgQNh++6ijEZF0UQ89xyxfDldfDXl5WqhCJG7UQ88xN98MCxbAqFEaoigSNyn10M2sg5nNMrPZZtanjOMXm9lHZjbdzCaZmR4cr4ZmzoT77oPzzoO2baOORkTSrcKEbmY1gP5AR6A10LWMhD3M3fdy932BO4B70h6pbBL38DToVlvBv/4VdTQikgmp9NDbArPdfY67/wSMADonN3D35UmbdQBPX4iSDs8/D2++CbfcolkUReIqlRp6Y2Bu0nYR0K50IzO7FLgK2Bw4sqw3MrN8IB+gWbNmlY1VNtKqVXDllbD33nDxxVFHIyKZkrZRLu7e3913Bq4BriunzSB3z3P3vAbqJlaJkhLo2RPmzoV+/aCmboOLxFYq/7znAU2Ttpsk9pVnBDBgU4KS9Fi2DP78Zxg7Njzm/6c/RR2RiGRSKj30qUBLM2thZpsDXYDRyQ3MrGXS5vHAZ+kLUTbGF1/AQQfBW2/Bww/DrbdGHZGIZFqFPXR3LzGznsBYoAbwqLsXmtnNQIG7jwZ6mtnRwBpgKXBOJoOWDfvuO2jfHhYvDr3zI8u8oyEicZNSRdXdxwBjSu27Punry9Mcl2ykdevgzDPhq69gwgQ4+OCoIxKRqqJbZDFz880wZgz0769kLpJrNJdLjLz8Mtx0E5xzDvzf/0UdjYhUNSX0mCgshG7doE0bGDAAzKKOSESqmhJ6DBQXw4knQp06YdKtLbeMOiIRiYJq6Flu9Wo45RSYPx/efhuaNq34e0QknpTQs5h7qJVPmgQjRmgGRZFcp5JLFnvgARgyBK6/PjwRKiK5TQk9S40bB1ddBZ07ww03RB2NiFQHSuhZ6Isv4IwzYNdd4YknYDNdRRFBCT3r/PQTnHoqrF0LL74I22wTdUQiUl3opmiWuf12+OADeOEFaNmy4vYikjvUQ88ihYVhxaEuXeCkk6KORkSqGyX0LLF2LZx/fiix3H9/1NGISHWkkkuWuO8+mDwZhg7VmqAiUjb10Ku5Vavgr3+Fv/wFTjgBunaNOiIRqa6U0KuxCRNgn33gzjtDuWXoUE26JSLlU0KvhhYtgvPOgyOOCI/3jxsHgwZpiKKIbFhKCd3MOpjZLDObbWZ9yjh+lZnNMLMPzewtM9sp/aHmhscfh913hyefhGuvhQ8/DIldRKQiFSZ0M6sB9Ac6Aq2BrmbWulSzD4A8d98beBa4I92B5oInn4QePaBVK5g+Hf75T6hdO+qoRCRbpNJDbwvMdvc57v4TMALonNzA3ce7+6rE5ntAk/SGGX+zZoWZEw89FMaPhz32iDoiEck2qST0xsDcpO2ixL7ynA+8WtYBM8s3swIzKyguLk49ypj78ccwW2KtWjBsGNTUYFIR2QhpTR1m1h3IAw4r67i7DwIGAeTl5Xk6z53NeveG//0PXnkFGm/ov0oRkQ1IJaHPA5LXwWmS2PcrZnY00Bc4zN1Xpye8+Bs2DB58EK6+Go47LupoRCSbpVJymQq0NLMWZrY50AUYndzAzPYDBgKd3H1h+sOMp2nTwvjyQw8NN0BFRDZFhQnd3UuAnsBYYCbwjLsXmtnNZtYp0exOYCtgpJlNN7PR5bydJCxcCCefHB7jHzkSfve7qCMSkWyXUg3d3ccAY0rtuz7p66PTHFesrV4Np50WHiCaNAkaNow6IhGJAz0pWsUWLYL27eE//4HBg6FNm6gjEpG40AC5KvTJJ2GCraKicDNUE22JSDqph15FnnsODjgAVqwIk24pmYtIuimhZ9jixdCtW6iZt2wJU6aExC4ikm5K6BmycCHccw/suSc8+2xYOu6dd2AnTVsmIhmiGnqaffopXHMNvPwylJTAQQfBa6+Fec1FRDJJCT2NVq6Ezp1hwQK44go491xoXXpeShGRDFFCT6MrrgizJr75Jhx5ZNTRiEiuUQ09TZ55Jowr79NHyVxEoqEe+iZaswYKCiA/H9q1g5tuijoiEclV6qFvpMGD4Y9/hK23Djc+ITwspDlZRCQqSuiVtGYNXHIJXHhh2O7VC4YPh5kz4Q9/iDY2EcltKrlUwuLFcPrpYYm4a66Bf/wDatSIOioRkUAJvQKrVoUx5c88E1YUWrcOnngCzjor6shERH5NCb0cq1fDwIFw661QXAyNGsEFF4RSy957Rx2diMhvKaGX4g4jRsDf/gZffhmGIPbtC4cdpvKKiFRvuima5KuvoGPHMJlWvXrw+uu/PCSkZC4i1Z166MDs2WECrVtvDdv33x9GsiiJi0g2SamHbmYdzGyWmc02sz5lHD/UzN43sxIzOy39YaZfURFcdRXsskuY1vbaa+GQQ6CwMAxFVDIXkWxTYUI3sxpAf6Aj0Broamalp5z6GugBDEt3gOn2zTchYe+8M/TrB61aQf/+oZf+2mua3lZEslcqJZe2wGx3nwNgZiOAzsCM9Q3c/cvEsXUZiHGTrFkD48bBW2+FlYKmTYPNNgszIfbtqwQuIvGRSkJvDMxN2i4C2m3MycwsH8gHaNas2ca8RUrWrg2Je+jQ8BRncXF4JP+AA+C666BHD2jRImOnFxGJRJXeFHX3QcAggLy8PE/ney9cCPfeC+++GybLWrkSttgCOnWC7t3h6KOhdu10nlFEpHpJJaHPA5ombTdJ7Ks2Jk+GU0+Fb7+FNm1COaVdOzjhBKhbN+roRESqRioJfSrQ0sxaEBJ5F6BbRqNKkTs8/HC4ybnjjmEB5v32izoqEZFoVDjKxd1LgJ7AWGAm8Iy7F5rZzWbWCcDM/mhmRcDpwEAzK8xk0CtX/jJ97UUXwRFHhJq5krmI5LKUaujuPgYYU2rf9UlfTyWUYjLukUfC+PHly2HPPWHAgDC/isaNi0iuy7onRZs1gxNPhIsvhoMPBrOoIxIRqR6yLqG3bx9eIiLya5qcS0QkJpTQRURiQgldRCQmlNBFRGJCCV1EJCaU0EVEYkIJXUQkJpTQRURiwtzTOott6ic2Kwa+2shvrw8sSmM42SIXP3cufmbIzc+di58ZKv+5d3L3BmUdiCyhbwozK3D3vKjjqGq5+Llz8TNDbn7uXPzMkN7PrZKLiEhMKKGLiMREtib0QVEHEJFc/Ny5+JkhNz93Ln5mSOPnzsoauoiI/Fa29tBFRKQUJXQRkZjIusGdXa8AAANySURBVIRuZh3MbJaZzTazPlHHkwlm1tTMxpvZDDMrNLPLE/vrmdkbZvZZ4s/too413cyshpl9YGYvJ7ZbmNnkxPV+2sw2jzrGdDOzumb2rJl9YmYzzezAHLnWVyZ+vj82s+FmVitu19vMHjWzhWb2cdK+Mq+tBfcnPvuHZtamsufLqoRuZjWA/kBHoDXQ1cxaRxtVRpQAvd29NXAAcGnic/YB3nL3lsBbie24uZywGPl6twP3uvsuwFLg/Eiiyqz7gNfcfXdgH8Lnj/W1NrPGwGVAnrvvCdQAuhC/6/0Y0KHUvvKubUegZeKVDwyo7MmyKqEDbYHZ7j7H3X8CRgCdI44p7dx9vru/n/h6BeEfeGPCZ3080exx4KRoIswMM2sCHA8MTmwbcCTwbKJJHD/ztsChwCMA7v6Tu39HzK91Qk1gSzOrCdQG5hOz6+3uE4ElpXaXd207A0948B5Q18x+X5nzZVtCbwzMTdouSuyLLTNrDuwHTAZ2cPf5iUMLgB0iCitT/g38FViX2N4e+M7dSxLbcbzeLYBiYEii1DTYzOoQ82vt7vOAu4CvCYl8GTCN+F9vKP/abnJ+y7aEnlPMbCvgOeAKd1+efMzDeNPYjDk1sxOAhe4+LepYqlhNoA0wwN33A1ZSqrwSt2sNkKgbdyb8h7YjUIffliZiL93XNtsS+jygadJ2k8S+2DGz3xGS+VB3fz6x+9v1v4Il/lwYVXwZcDDQycy+JJTSjiTUlusmfiWHeF7vIqDI3Scntp8lJPg4X2uAo4Ev3L3Y3dcAzxN+BuJ+vaH8a7vJ+S3bEvpUoGXiTvjmhJsooyOOKe0SteNHgJnufk/SodHAOYmvzwFerOrYMsXdr3X3Ju7enHBdx7n7mcB44LREs1h9ZgB3XwDMNbPdEruOAmYQ42ud8DVwgJnVTvy8r//csb7eCeVd29HA2YnRLgcAy5JKM6lx96x6AccBnwKfA32jjidDn/EQwq9hHwLTE6/jCDXlt4DPgDeBelHHmqHPfzjwcuLrPwBTgNnASGCLqOPLwOfdFyhIXO9RwHa5cK2Bm4BPgI+BJ4Et4na9geGEewRrCL+NnV/etQWMMIrvc+AjwgigSp1Pj/6LiMREtpVcRESkHEroIiIxoYQuIhITSugiIjGhhC4iEhNK6CIiMaGELiISE/8Ppp692FNyY1UAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "sbEwEyOom0Ku",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 54
        },
        "outputId": "f10c0603-20fd-48db-ce61-4fa786f84fdf"
      },
      "source": [
        "seed_text = \"I really like the Arctic Monkeys and \"\n",
        "next_words = 100\n",
        "  \n",
        "for _ in range(next_words):\n",
        "\ttoken_list = tokenizer.texts_to_sequences([seed_text])[0]\n",
        "\ttoken_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')\n",
        "\tpredicted = model.predict_classes(token_list, verbose=0)\n",
        "\toutput_word = \"\"\n",
        "\tfor word, index in tokenizer.word_index.items():\n",
        "\t\tif index == predicted:\n",
        "\t\t\toutput_word = word\n",
        "\t\t\tbreak\n",
        "\tseed_text += \" \" + output_word\n",
        "print(seed_text)"
      ],
      "execution_count": 14,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "I really like the Arctic Monkeys and  at me just been me so around there's lover i'll fall long long time round but you know if you want to tell there slippers of stay with against the wall end action lined up popping up up up and stay with your hands around your head around my neck gets lotion i sit and talk to me on the floor with in the day round but i said i want to tell settling down or giving up in wicker chair and you imagined i could imagined i could want to you found the place on of stay with the\n"
          ],
          "name": "stdout"
        }
      ]
    }
  ]
}
